#include "lcd.h"
#include "lcd_init.h"
#include "lcdfont.h"
#include "limits.h"
#include "math.h"
#include "spi.h"
#include "dma.h"
#include <string.h>
#include <stdlib.h>

#define M_PI 3.14159265358979323846
#define DEG2RAD(x) ((x) * (M_PI / 180.0))

float circle_last_angle = 0;

uint8_t Send_Buff[LCD_W*2];
uint8_t Send_Buff_Point[LCD_W*2];

/******************************************************************************
      函数说明：在指定区域填充颜色
      入口数据：xsta,ysta   起始坐标
                xend,yend   终止坐标
								color       要填充的颜色
      返回值：  无
******************************************************************************/
// void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
// {          
// 	u16 i,j; 
// 	LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围
// 	for(i=ysta;i<yend;i++)
// 	{													   	 	
// 		for(j=xsta;j<xend;j++)
// 		{
// 			LCD_WR_DATA(color);
// 		}
// 	} 	

// 	// for(i=ysta;i<yend;i++)
// 	// {													   	 	
// 	// 	for(j=xsta;j<xend;j+=2)
// 	// 	{
// 	//  		Send_Buff[j] = color>>8;
// 	//     	Send_Buff[j+1] = color;
// 	//  	}
// 	// 	HAL_SPI_Transmit_DMA(&hspi1,Send_Buff,LCD_W*2);
// 	// 	// while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
		
// 	// }	

// // 	// for(i=0;i<LCD_W*2;)	
// // 	// {
// // 	// 	Send_Buff[i] = color>>8;
// // 	// 	Send_Buff[i+1] = color;
// // 	// 	i+=2;
// // 	// }	
// // 	// for(j=0;j<LCD_W;j++)
// // 	// {
// // 	// 	HAL_SPI_Transmit_DMA(&hspi1,Send_Buff,LCD_W*2);
// // 	// }
// }

//使用DMA
void LCD_Fill(u16 xsta, u16 ysta, u16 xend, u16 yend, u16 color) {
    u16 i, j;
    u16 width = xend - xsta ;  // +1 to include the end pixel
    u16 height = yend - ysta ; // +1 to include the end pixel

    // 设置显示范围
    LCD_Address_Set(xsta, ysta, xend-1, yend-1);

    // 填充 Send_Buff 数组并发送
    for (j = 0; j < height; j++) {
        memset(Send_Buff, 0, sizeof(Send_Buff));  // 清空缓冲区
        for (i = 0; i < width; i++) {
            Send_Buff[i * 2] = color >> 8;
            Send_Buff[i * 2 + 1] = color;
        }
		LCD_CS_Clr();
        HAL_SPI_Transmit_DMA(&hspi1, Send_Buff, width * 2);  // 发送一行数据
        while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);  // 等待DMA发送完成
		LCD_CS_Set();
    }
}


/******************************************************************************
      函数说明：在指定位置画点
      入口数据：x,y 画点坐标
                color 点的颜色
      返回值：  无
******************************************************************************/
void LCD_DrawPoint(u16 x,u16 y,u16 color)
{
	LCD_Address_Set(x,y,x,y);//设置光标位置 
	LCD_WR_DATA(color);
	
} 

// void LCD_DrawPoint(u16 x, u16 y, u16 color) {
//     // 清空缓冲区
//     memset(Send_Buff_Point, 0, sizeof(Send_Buff_Point));
    
//     // 将颜色值填充到缓冲区，这里假设您想要将同一个颜色值重复256次
//     for (int i = 0; i < LCD_W / 2; i++) {
//         Send_Buff_Point[i * 2] = color >> 8; // 高位
//         Send_Buff_Point[i * 2 + 1] = color;  // 低位
//     }
    
//     // 设置光标位置
//     LCD_Address_Set(x, y, x, y);
    
//     // 清除片选信号
//     LCD_CS_Clr();
    
//     // 使用DMA发送整个缓冲区
//     HAL_SPI_Transmit_DMA(&hspi1, Send_Buff_Point, sizeof(Send_Buff_Point));
    
//     // 等待DMA发送完成
//     while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
    
//     // 设置片选信号
//     LCD_CS_Set();
// }


/******************************************************************************
      函数说明：画线
      入口数据：x1,y1   起始坐标
                x2,y2   终止坐标
                color   线的颜色
      返回值：  无
******************************************************************************/
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color)
{
	u16 t; 
	int xerr=0,yerr=0,delta_x,delta_y,distance;
	int incx,incy,uRow,uCol;
	delta_x=x2-x1; //计算坐标增量 
	delta_y=y2-y1;
	uRow=x1;//画线起点坐标
	uCol=y1;
	if(delta_x>0)incx=1; //设置单步方向 
	else if (delta_x==0)incx=0;//垂直线 
	else {incx=-1;delta_x=-delta_x;}
	if(delta_y>0)incy=1;
	else if (delta_y==0)incy=0;//水平线 
	else {incy=-1;delta_y=-delta_y;}
	if(delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 
	else distance=delta_y;
	for(t=0;t<distance+1;t++)
	{
		LCD_DrawPoint(uRow,uCol,color);//画点
		xerr+=delta_x;
		yerr+=delta_y;
		if(xerr>distance)
		{
			xerr-=distance;
			uRow+=incx;
		}
		if(yerr>distance)
		{
			yerr-=distance;
			uCol+=incy;
		}
	}
}


/******************************************************************************
      函数说明：画矩形
      入口数据：x1,y1   起始坐标
                x2,y2   终止坐标
                color   矩形的颜色
      返回值：  无
******************************************************************************/
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
	LCD_DrawLine(x1,y1,x2,y1,color);
	LCD_DrawLine(x1,y1,x1,y2,color);
	LCD_DrawLine(x1,y2,x2,y2,color);
	LCD_DrawLine(x2,y1,x2,y2,color);
}


/******************************************************************************
      函数说明：画圆
      入口数据：x0,y0   圆心坐标
                r       半径
                color   圆的颜色
      返回值：  无
******************************************************************************/
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color)
{
	int a,b;
	a=0;b=r;	  
	while(a<=b)
	{
		LCD_DrawPoint(x0-b,y0-a,color);             //3           
		LCD_DrawPoint(x0+b,y0-a,color);             //0           
		LCD_DrawPoint(x0-a,y0+b,color);             //1                
		LCD_DrawPoint(x0-a,y0-b,color);             //2             
		LCD_DrawPoint(x0+b,y0+a,color);             //4               
		LCD_DrawPoint(x0+a,y0-b,color);             //5
		LCD_DrawPoint(x0+a,y0+b,color);             //6 
		LCD_DrawPoint(x0-b,y0+a,color);             //7
		a++;
		if((a*a+b*b)>(r*r))//判断要画的点是否过远
		{
			b--;
		}
	}
}

//画填充圆
void Draw_FillCircle(u16 x0, u16 y0, u8 r, u16 color) 
{
    int x, y, p;
    y = r;  // 从圆的顶部开始
    while (y >= 0) {
        x = sqrt(r * r - y * y);  // 计算当前行的 x 范围
        // 绘制当前行的所有点
        for (int i = -x; i <= x; i++) {
            LCD_DrawPoint(x0 + i, y0 + y, color);
            LCD_DrawPoint(x0 - i, y0 + y, color);
            LCD_DrawPoint(x0 + i, y0 - y, color);
            LCD_DrawPoint(x0 - i, y0 - y, color);
        }
        // 根据 Bresenham 算法的递推公式更新 y 和决策参数 p
        p = (int)((r * r) / 4 - (y * y) * 4 - (x * x) * 4) + 1;
        if (p < 0) {
            y--;
        } else {
            y--;
            x = (int)sqrt((float)p);
        }
    }
}



/******************************************************************************
      函数说明：显示汉字串
      入口数据：x,y显示坐标
                *s 要显示的汉字串
                fc 字的颜色
                bc 字的背景色
                sizey 字号 可选 16 24 32
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	while(*s!=0)
	{
		if(sizey==12) LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode);
		else if(sizey==16) LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode);
		else if(sizey==24) LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode);
		else if(sizey==32) LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode);
		else return;
		s+=2;
		x+=sizey;
	}
}

/******************************************************************************
      函数说明：显示单个12x12汉字
      入口数据：x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	u8 i,j,m=0;
	u16 k;
	u16 HZnum;//汉字数目
	u16 TypefaceNum;//一个字符所占字节大小
	u16 x0=x;
	TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
	                         
	HZnum=sizeof(tfont12)/sizeof(typFNT_GB12);	//统计汉字数目
	for(k=0;k<HZnum;k++) 
	{
		if((tfont12[k].Index[0]==*(s))&&(tfont12[k].Index[1]==*(s+1)))
		{ 	
			LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
			for(i=0;i<TypefaceNum;i++)
			{
				for(j=0;j<8;j++)
				{	
					if(!mode)//非叠加方式
					{
						if(tfont12[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
						else LCD_WR_DATA(bc);
						m++;
						if(m%sizey==0)
						{
							m=0;
							break;
						}
					}
					else//叠加方式
					{
						if(tfont12[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);//画一个点
						x++;
						if((x-x0)==sizey)
						{
							x=x0;
							y++;
							break;
						}
					}
				}
			}
		}				  	
		continue;  //查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响
	}
} 

/******************************************************************************
      函数说明：显示单个16x16汉字
      入口数据：x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	u8 i,j,m=0;
	u16 k;
	u16 HZnum;//汉字数目
	u16 TypefaceNum;//一个字符所占字节大小
	u16 x0=x;
  TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
	HZnum=sizeof(tfont16)/sizeof(typFNT_GB16);	//统计汉字数目
	for(k=0;k<HZnum;k++) 
	{
		if ((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1)))
		{ 	
			LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
			for(i=0;i<TypefaceNum;i++)
			{
				for(j=0;j<8;j++)
				{	
					if(!mode)//非叠加方式
					{
						if(tfont16[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
						else LCD_WR_DATA(bc);
						m++;
						if(m%sizey==0)
						{
							m=0;
							break;
						}
					}
					else//叠加方式
					{
						if(tfont16[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);//画一个点
						x++;
						if((x-x0)==sizey)
						{
							x=x0;
							y++;
							break;
						}
					}
				}
			}
		}				  	
		continue;  //查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响
	}
} 


/******************************************************************************
      函数说明：显示单个24x24汉字
      入口数据：x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	u8 i,j,m=0;
	u16 k;
	u16 HZnum;//汉字数目
	u16 TypefaceNum;//一个字符所占字节大小
	u16 x0=x;
	TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
	HZnum=sizeof(tfont24)/sizeof(typFNT_GB24);	//统计汉字数目
	for(k=0;k<HZnum;k++) 
	{
		if ((tfont24[k].Index[0]==*(s))&&(tfont24[k].Index[1]==*(s+1)))
		{ 	
			LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
			for(i=0;i<TypefaceNum;i++)
			{
				for(j=0;j<8;j++)
				{	
					if(!mode)//非叠加方式
					{
						if(tfont24[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
						else LCD_WR_DATA(bc);
						m++;
						if(m%sizey==0)
						{
							m=0;
							break;
						}
					}
					else//叠加方式
					{
						if(tfont24[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);//画一个点
						x++;
						if((x-x0)==sizey)
						{
							x=x0;
							y++;
							break;
						}
					}
				}
			}
		}				  	
		continue;  //查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响
	}
} 

/******************************************************************************
      函数说明：显示单个32x32汉字
      入口数据：x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	u8 i,j,m=0;
	u16 k;
	u16 HZnum;//汉字数目
	u16 TypefaceNum;//一个字符所占字节大小
	u16 x0=x;
	TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
	HZnum=sizeof(tfont32)/sizeof(typFNT_GB32);	//统计汉字数目
	for(k=0;k<HZnum;k++) 
	{
		if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1)))
		{ 	
			LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
			for(i=0;i<TypefaceNum;i++)
			{
				for(j=0;j<8;j++)
				{	
					if(!mode)//非叠加方式
					{
						if(tfont32[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
						else LCD_WR_DATA(bc);
						m++;
						if(m%sizey==0)
						{
							m=0;
							break;
						}
					}
					else//叠加方式
					{
						if(tfont32[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);//画一个点
						x++;
						if((x-x0)==sizey)
						{
							x=x0;
							y++;
							break;
						}
					}
				}
			}
		}				  	
		continue;  //查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响
	}
}


/******************************************************************************
      函数说明：显示单个字符
      入口数据：x,y显示坐标
                num 要显示的字符
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	u8 temp,sizex,t,m=0;
	u16 i,TypefaceNum;//一个字符所占字节大小
	u16 x0=x;
	sizex=sizey/2;
	TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;
	num=num-' ';    //得到偏移后的值
	LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);  //设置光标位置 
	for(i=0;i<TypefaceNum;i++)
	{ 
		if(sizey==12)temp=ascii_1206[num][i];		       //调用6x12字体
		else if(sizey==16)temp=ascii_1608[num][i];		 //调用8x16字体
		else if(sizey==24)temp=ascii_2412[num][i];		 //调用12x24字体
		else if(sizey==32)temp=ascii_3216[num][i];		 //调用16x32字体
		else return;
		for(t=0;t<8;t++)
		{
			if(!mode)//非叠加模式
			{
				if(temp&(0x01<<t))LCD_WR_DATA(fc);
				else LCD_WR_DATA(bc);
				m++;
				if(m%sizex==0)
				{
					m=0;
					break;
				}
			}
			else//叠加模式
			{
				if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//画一个点
				x++;
				if((x-x0)==sizex)
				{
					x=x0;
					y++;
					break;
				}
			}
		}
	}   	 	  
}


/******************************************************************************
      函数说明：显示字符串
      入口数据：x,y显示坐标
                *p 要显示的字符串
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode)
{         
	while(*p!='\0')
	{       
		LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
		x+=sizey/2;
		p++;
	}  
}


/******************************************************************************
      函数说明：显示数字
      入口数据：m底数，n指数
      返回值：  无
******************************************************************************/
u32 mypow(u8 m,u8 n)
{
	u32 result=1;	 
	while(n--)result*=m;
	return result;
}


/******************************************************************************
      函数说明：显示整数变量
      入口数据：x,y显示坐标
                num 要显示整数变量
                len 要显示的位数
                fc 字的颜色
                bc 字的背景色
                sizey 字号
      返回值：  无
******************************************************************************/
void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey)
{         	
	u8 t,temp;
	u8 enshow=0;
	u8 sizex=sizey/2;
	for(t=0;t<len;t++)
	{
		temp=(num/mypow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				LCD_ShowChar(x+t*sizex,y,' ',fc,bc,sizey,0);
				continue;
			}else enshow=1; 
		 	 
		}
	 	LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
	}
} 


/******************************************************************************
      函数说明：显示两位小数变量
      入口数据：x,y显示坐标
                num 要显示小数变量
                len 要显示的位数
                fc 字的颜色
                bc 字的背景色
                sizey 字号
      返回值：  无
******************************************************************************/
void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey)
{         	
	u8 t,temp,sizex;
	u16 num1;
	sizex=sizey/2;
	num1=num*100;
	for(t=0;t<len;t++)
	{
		temp=(num1/mypow(10,len-t-1))%10;
		if(t==(len-2))
		{
			LCD_ShowChar(x+(len-2)*sizex,y,'.',fc,bc,sizey,0);
			t++;
			len+=1;
		}
	 	LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
	}
}


/******************************************************************************
      函数说明：显示图片
      入口数据：x,y起点坐标
                length 图片长度
                width  图片宽度
                pic[]  图片数组    
      返回值：  无
******************************************************************************/
void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
{
	u16 i,j;
	u32 k=0;
	LCD_Address_Set(x,y,x+length-1,y+width-1);
	for(i=0;i<length;i++)
	{
		for(j=0;j<width;j++)
		{
			LCD_WR_DATA8(pic[k*2]);
			LCD_WR_DATA8(pic[k*2+1]);
			k++;
		}
	}			
}


void Draw_Arc(u16 x0, u16 y0, u8 r, float start_angle, float rotation_angle, u16 color, u8 line_thickness, u16 background_color)
{
    float angle_step = 0.05; // 步长，可以调整以改变弧线的平滑度
    float angle;

    // 将角度从度转换为弧度
    // float start_rad = DEG2RAD(start_angle);
    // float rotation_rad = DEG2RAD(rotation_angle);

	float start_rad = start_angle;
    float rotation_rad = rotation_angle;

    // 初始化起始点
    float last_x = r * cos(start_rad) + x0;
    float last_y = r * sin(start_rad) + y0;

    // 计算结束角度的弧度
    float end_rad = start_rad + rotation_rad;

    // 绘制起始点的小矩形，以覆盖前一个圆弧的末端
    // if (start_rad != 0) {
    //     float start_x = r * cos(start_rad - angle_step) + x0;
    //     float start_y = r * sin(start_rad - angle_step) + y0;
    //     LCD_DrawRectangle((u16)(last_x - line_thickness), (u16)(last_y - line_thickness), (u16)(start_x + line_thickness), (u16)(start_y + line_thickness), background_color);
    // }

    // 根据旋转角度的方向绘制圆弧
    for (angle = start_rad + (rotation_angle >= 0 ? angle_step : -angle_step); (rotation_angle >= 0 ? angle <= end_rad : angle >= end_rad); angle += (rotation_angle >= 0 ? angle_step : -angle_step)) {
        float x = r * cos(angle) + x0;
        float y = r * sin(angle) + y0;

        // 绘制填充区域以增加厚度
        for (u8 t = 0; t < line_thickness; t++) {
            LCD_DrawRectangle((u16)(last_x - t), (u16)(last_y - t), (u16)(x + t), (u16)(y + t), color);
        }

        // 更新最后一个点的坐标
        last_x = x;
        last_y = y;
    }

    // 绘制最后一个填充区域到结束点
    float end_x = r * cos(end_rad) + x0;
    float end_y = r * sin(end_rad) + y0;
    for (u8 t = 0; t < line_thickness; t++) {
        LCD_DrawRectangle((u16)(last_x - t), (u16)(last_y - t), (u16)(end_x + t), (u16)(end_y + t), color);
    }

    // 绘制结束点的小矩形，以覆盖下一个圆弧的起始点
    // if (end_rad != DEG2RAD(360)) {
    //     float end_x = r * cos(end_rad + angle_step) + x0;
    //     float end_y = r * sin(end_rad + angle_step) + y0;
    //     LCD_DrawRectangle((u16)(end_x - line_thickness), (u16)(end_y - line_thickness), (u16)(last_x + line_thickness), (u16)(last_y + line_thickness), background_color);
    // }
}

// void Draw_Arc()
// {

// }

void Draw_Clear_Arc(u16 x0, u16 y0, u8 r, float start_angle, float end_angle, u16 color)
{
    // 绘制一个覆盖整个圆弧区域的矩形
    float rect_x0 = x0 - r;
    float rect_y0 = y0 - r;
    float rect_x1 = x0 + r;
    float rect_y1 = y0 + r;
    LCD_DrawRectangle((u16)rect_x0, (u16)rect_y0, (u16)rect_x1, (u16)rect_y1, color);
}


/*
x0,y0:球绕的圆心坐标
r1:球到圆心的距离，r2:球的半径
angle:旋转角度
*/
void LCD_Draw_Movement_Ball(u16 x0,u16 y0,u8 r1, u8 r2, float angle,u16 color)
{
	if(angle != circle_last_angle)  
	{
		if(angle > circle_last_angle)
		{
			// // Draw_Circle(120 - r1*cos(angle), 120 - r1*sin(angle), r2, GREEN);
			// // Draw_Circle(120 - 70*cos(angle), 120 - 70*sin(angle), r2, RED);
			// // LCD_Fill(120 - r1*cos(angle)-3, 120 - r1*sin(angle)-3, 120 - r1*cos(angle)+3, 120 - r1*sin(angle)+3, RED);

			Draw_FillCircle(120 - 70*cos(angle), 120 - 70*sin(angle), r2, RED);
		}
		if(angle <= circle_last_angle)
		{
			// // Draw_Circle(120 - r1*sin(circle_last_angle), 120 - r1*cos(circle_last_angle), r2, BLACK);
			// // LCD_Fill(120 - 70*cos(circle_last_angle)-4,120 - 70*sin(circle_last_angle)-4,120 - 70*cos(circle_last_angle)+4,120 - 70*sin(circle_last_angle)+4,BLACK);

			Draw_FillCircle(120 - 70*cos(angle), 120 - 70*sin(angle), r2+1, BLACK);
		}
	}
	// Draw_Circle(120 - r1*sin(circle_last_angle), 120 - r1*cos(circle_last_angle), r2, BLACK);
	

	// Draw_Circle(120 - r1*sin(angle), 120 - r1*cos(angle), r2, RED);
	circle_last_angle = angle;
}


void LCD_Draw_Arc(u16 x0, u16 y0, u8 r, float start_angle, float end_angle, u16 color, u8 thickness) 
{
    float angle_step = 0.01; // 步长，可以调整以改变弧线的平滑度
    float angle;

    // 将角度从度转换为弧度
    float start_rad = start_angle;
    float end_rad = end_angle;

    if (end_rad > start_rad) {
        // 绘制圆弧
        for (angle = start_rad; angle <= end_rad; angle += angle_step) {
            // 计算圆弧上的点
            float px = r * cos(angle) + x0;
            float py = r * sin(angle) + y0;

            // 绘制圆弧的外边缘
            for (int i = -thickness / 2; i <= thickness / 2; i++) {
                float tx = px + i * cos(angle + M_PI / 2);
                float ty = py + i * sin(angle + M_PI / 2);
                LCD_DrawPoint((u16)tx, (u16)ty, color);
            }
        }
    } else {
        // 清除圆弧
        for (angle = start_rad; angle >= end_rad; angle -= angle_step) {
            // 计算圆弧上的点
            float px = r * cos(angle) + x0;
            float py = r * sin(angle) + y0;

            // 清除圆弧的外边缘
            for (int i = -(thickness+20) / 2; i <= (thickness+20) / 2; i++) {
                float tx = px + i * cos(angle + M_PI / 2);
                float ty = py + i * sin(angle + M_PI / 2);
                LCD_DrawPoint((u16)tx, (u16)ty, BLACK);
            }
        }
    }
}

//显示数字，格式为八位数码管
void Gui_DrawFont_Num32(u16 x, u16 y, u16 fc, u16 bc, u16 num)
{
	unsigned char i,j,k,c;
	//lcd_text_any(x+94+i*42,y+34,32,32,0x7E8,0x0,sz32,knum[i]);
//	w=w/8;

    for(i=0;i<32;i++)
	{
		for(j=0;j<4;j++) 
		{
			c=*(sz32+num*32*4+i*4+j);
			for (k=0;k<8;k++)	
			{
	
		    	if(c&(0x80>>k))	LCD_DrawPoint(x+j*8+k,y+i,fc);
				else {
					if (fc!=bc) LCD_DrawPoint(x+j*8+k,y+i,bc);
				}
			}
		}
	}
}

